package g

import (
	"reflect"
	"testing"
)

func Test_mergeTrees(t *testing.T) {
	type args struct {
		root1 *TreeNode
		root2 *TreeNode
	}
	tests := []struct {
		name string
		args args
		want *TreeNode
	}{
		{"1", args{GetTreeNode([]int{}),
			GetTreeNode([]int{1, null, 2, 3})},
			GetTreeNode([]int{1, null, 2, 3})},
		{"2", args{nil, nil}, nil},
		//     输入:
		// 	Tree 1                     Tree 2
		//           1                         1
		//                                    /
		//                                   2
		// 输出:
		// 合并后的树:
		// 	     2
		// 	    /
		// 	   2
		{"3", args{GetTreeNode([]int{1}),
			GetTreeNode([]int{1, 2})},
			GetTreeNode([]int{2, 2})},
		//     输入:
		// 	Tree 1                     Tree 2
		//           1                         2
		//          / \                       / \
		//         3   2                     1   3
		//        /                           \   \
		//       5                             4   7
		// 输出:
		// 合并后的树:
		// 	     3
		// 	    / \
		// 	   4   5
		// 	  / \   \
		// 	 5   4   7
		{"4", args{GetTreeNode([]int{1, 3, 2, 5}),
			GetTreeNode([]int{2, 1, 3, null, 4, null, 7})},
			GetTreeNode([]int{3, 4, 5, 5, 4, null, 7})},
		//     输入:
		// 	Tree 1                     Tree 2
		//           3                         4
		//          / \                       / \
		//         4   5                     1   2
		//        / \                       /
		//       1   2                     1
		// 输出:
		// 合并后的树:
		// 	     7
		// 	    / \
		// 	   5   7
		// 	  / \
		// 	 2   2
		{"5", args{GetTreeNode([]int{3, 4, 5, 1, 2}),
			GetTreeNode([]int{4, 1, 2, 1})},
			GetTreeNode([]int{7, 5, 7, 2, 2})},
		//     输入:
		// 	Tree 1                     Tree 2
		//            -6                      -6           //
		//          /    \                  /    \         //
		//         -9    -3                -9    -3        //
		//          \    /  \               \    /  \      //
		//          -8  -4   1              -8  -4   1     //
		//           \      /  \             \             //
		//           -7     0   5            -7            //
		//                     /                           //
		//                    2                            //
		// 输出:
		// 合并后的树:
		//            -12
		//          /    \
		//         -18    -6
		//          \    /  \
		//          -16  -8   2
		//           \      /  \
		//           -14    0   5
		//                     /
		//                    2
		{"6", args{GetTreeNode([]int{-6, -9, -3, null, -8, -4, 1, null, -7, null, null, 0, 5, null, null, null, null, 2}),
			GetTreeNode([]int{-6, -9, -3, null, -8, -4, 1, null, -7})},
			GetTreeNode([]int{-12, -18, -6, null, -16, -8, 2, null, -14, null, null, 0, 5, null, null, null, null, 2})},
		{"7", args{GetTreeNode([]int{}),
			GetTreeNode([]int{})},
			GetTreeNode([]int{})},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := mergeTrees(tt.args.root1, tt.args.root2); !reflect.DeepEqual(got, tt.want) {
				t.Errorf("%v mergeTrees() = %v, want %v", tt.name, got, tt.want)
			}
		})
	}
}
